

// 1. 利用泛型去约束函数
// function getLength(s: string) {
//     console.log(s.length);
// }

// 做一些改造，使用泛型
interface fnType {
    length: number
}
function getLength<T extends fnType>(s: T ) {
    console.log(s.length);
}

// 如果不改变的话，那么只能传字符
// getLength('hello')
// getLength<number[]>([88])
// getLength<boolean>(false) // X


// 2. 类型的别名
// type 关键字用于定义别名, 返回的结果是一个类型
// 不方便打印
// type Name = string;
// 将来数据的类型比较多，需要联合类型，那么别名可以简写
type Name = string | number | boolean;

let userName: Name;
userName = '陈伟霆';
// userName = false;

// 定义对象作为别名，有点儿像接口
type person = {
    name: string,
    age: 20
}
let obj: person;
obj = {
    name: '古力娜扎',
    age: 20
}

// 指定别名，是其他数据的集合
type arrType = person[];
let arr: arrType;
arr = [
    { name: '易烊千玺', age: 20 },
    { name: '易烊千玺', age: 20 },
    { name: '易烊千玺', age: 20 }
];
